package com.learn.metrics.type.timer;

import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.RandomUtil;
import com.codahale.metrics.Timer;
import com.learn.metrics.util.MetricUtil;

/**
 * @author XuYang
 * @since 2025/2/19 9:59
 */
public class TimerExample {

    public static void start(Integer interval) {
        MetricUtil.startReporter(interval);
        Timer timer = MetricUtil.REGISTRY.timer("timers");
        Timer.Context ctx;

        int count = 0;
        while (count++ < 100) {
            ctx = timer.time();
            ThreadUtil.sleep(RandomUtil.randomInt(1000));
            ctx.stop();
        }

        // 计时器执行次数
        timer.getCount();
        // 平均TPS
        timer.getMeanRate();
        // 最近1分钟TPS
        timer.getOneMinuteRate();
        // 最近5分钟TPS
        timer.getFiveMinuteRate();
        // 最近15分钟TPS
        timer.getFifteenMinuteRate();

        // 计时器直方图
        // 输入时间最小值
        timer.getSnapshot().getMin();
        // 输入时间最大值
        timer.getSnapshot().getMax();
        // 输入时间平均值
        timer.getSnapshot().getMean();
        // 输入时间值中的标准偏差值
        timer.getSnapshot().getStdDev();
        // 输入时间中位数
        timer.getSnapshot().getMedian();
        // 输入时间75百分位
        timer.getSnapshot().get75thPercentile();
        // 输入时间95百分位
        timer.getSnapshot().get95thPercentile();
        // 输入时间98百分位
        timer.getSnapshot().get98thPercentile();
        // 输入时间99百分位
        timer.getSnapshot().get99thPercentile();
        // 输入时间99.9百分位
        timer.getSnapshot().get999thPercentile();
    }
}
